package com.demo.java.OD451_500.OD453;

import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【员工派遣(C&D卷)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146340531
 */
public class OdMain {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long x = scanner.nextLong(), y = scanner.nextLong(), cntx = scanner.nextLong(), cnty = scanner.nextLong();
        System.out.println(findMinimumK(x, y, cntx, cnty));  // 调用方法来计算最小的k值
    }

    // 二分查找方法来查找最小的k值
    public static long findMinimumK(long x, long y, long cntx, long cnty) {
        long l = 1, r = (long) Math.pow(10, 18);  // 设置二分查找的范围

        while (l < r) {
            long mid = l + (r - l) / 2;  // 计算中间值
            if (isValid(mid, x, y, cntx, cnty)) r = mid;  // 如果当前k值有效，则缩小右边界
            else l = mid + 1;  // 否则，增加左边界
        }

        return l;  // 返回最终的最小k值
    }

    // 判断当前k值是否满足条件
    public static boolean isValid(long k, long x, long y, long cntx, long cnty) {
        // 计算在k天内x国和y国代表的数量
        long a = k / x - k / (x * y);  // x国代表的数量
        long b = k / y - k / (x * y);  // y国代表的数量
        long d = k - a - b;  // 剩余的代表数

        // 判断是否满足每个国家的代表需求
        return d >= Math.max(0, cntx - b) + Math.max(0, cnty - a);
    }
}